;(function (jQuery){
	$.fn.extend({
		//ver1.1_1202_rc
		//配置式：访问方式，状态内容，准备函数，成功函数，结函数
		
		/**
		*	当前的配置式
		*	refuse: 拒绝函数。数据被拒绝
		*	approve: 成功函数。数据被接受
		*	custom:	自定义处理函数。
		*	tip: 自定义提示信息,配置custom使用
		*	tipelem: AJAX固定位置对象
		*	tiptime: 自动隐藏的时间
		**/
		doajax:function(funcs){
			var XMLHttp = new Array();
			var timer = new Array();
			var elems = new Array();
			var roots = new Array();
			var tipe = 0;
			defaults = {type:'get', status:'default', domain:'localhost,niuxing.net,baidu.com,yahoo',loading_text:'正在处理……',tip_text:'提交数据……',flag_1:'1',flag_0:'0'};
			_init();
			$(this).click(function(){//初始化
				elem = $(this);
				href = _src();
				if(!href || href=='')return;//无连接不执行
				
				if(funcs.tipelem){
					tipe = eval("$(this)." + funcs.tipelem);//操作对象
					//分配线程号
					if(elems.length>0){
						var ci;
						for(i=0; i<roots.length;i++){
							if(elem.parent().html() == roots[i].parent().html()){
								ci = i;
							}
						}
						if(typeof(ci) == 'number'){
							ei = ci;
						}else{
							ei = roots.length;
							elems[ei] = tipe;
							roots[ei] = $(this);
						}
					}else{
						ei = roots.length;
						elems[ei] = tipe;
						roots[ei] = $(this);
					}
				}else{
					tipe = 'atip';//进行loading提示效果
					ei = '';
				}
				//alert('DEBUG : 线程：'+ei+" 当前Timer："+timer[ei]+" 对象组："+elems);//DEBUG
				if(timer[ei])return false;
				_go($(this).attr('href'), '', 'get' ,funcs, ei);
				return false;
			});		
			
			function _src(){
				if(!funcs.src){
					if(elem.is("a")){
						href = elem.attr('href');
					}else if(elem.is("form")){
						href = elem.attr('action');
					}else{
						href = '';
					}
				}else{
					if(funcs.src.indexOf('http://')>=0){						
						href = funcs.src;
					}else if(funcs.src.indexOf('./')==0){
						pre = location.href.substring(0, location.href.lastIndexOf("/")+1);
						href = pre+funcs.src.substr(2);
					}else{
						pre = location.href.substring(0, location.href.lastIndexOf("/")+1);
						href = pre+funcs.src;
					}
					//alert(href);return false;
				}
				if(!href || href=='')return false;//无连接不执行
			
				if(href.indexOf('http://')>=0){
					allow = false;
					if(defaults.domain.indexOf(',')>=0){
						arr = defaults.domain.split(',');
						for(i=0;i<arr.length;i++){
							if(href.indexOf(arr[i])>=0)allow=true;
						}
					}else{
						if(href.indexOf(defaults.domain)>=0)allow=true;
					}
					if(!allow){
						_atip('不允许的域！');
						return false;
					}
				}
				return href;
			}
			//加载LOADING层
			function _init(s){
				if(s==0){
					$("#doajax_div_loading").remove();
					return;
				}
				if($("#doajax_div_loading").size()<=0){
					$(document.body).append("<div id='doajax_div_loading' class='doajax_loading'>" + defaults.loading_text + "</div>");
				}else{
					_status(0);
				}
			}
			//在指定位置加载ETIP层
			function _inite(ti){
				//alert(timer);
				tipelem = elems[ti];
				if(tipelem.find("div[rel='etip'] b").size()>0){					
					if(tipelem.find("div[rel='etip']").hasClass('doajax_etip'))
						return;
					else				
						tipelem.find("div[rel='etip']").remove();
				}
				tipelem.append("<div rel='etip' class='doajax_etip'><b>×</b>" + defaults.tip_text + "</div>");
				tipelem.find("div[rel='etip'] b").click(function(){
					$(this).parent("div[rel='etip']").remove();
					//_estatus(ti, 1);
					timer[ti] = null;
					XMLHttp[ti].abort();
					XMLHttp[ti] = null;
				});
			}
			//LOADING层的状态更改
			function _status(s){
				if(s==0){
					_atip('', 0);
					$("#doajax_div_loading").hide();
					$("#doajax_div_loading").removeClass('doajax_loading_ok').addClass('doajax_loading');
					return;
				}
				$("#doajax_div_loading").show();
				return;
			}
			//控制ETIP对象的显示和效果
			function _estatus(ti, s){
				//alert(timer);
				tipelem = elems[ti];
				if(s==0){//还原状态
					//tipelem.find("span[rel='etip']").hide();
					tipelem.find("div[rel='etip']").html(defaults.tip_text);
					tipelem.find("div[rel='etip']").removeClass('doajax_etip_ok').addClass('doajax_etip');
					return;
				}else if(s==1){//清除状态
					tipelem.find("div[rel='etip']").remove();
					timer[ti] = null;
					return;
				}
				_inite(ti);
			}
			//状态改变函数，控制两种层
			function _atip(ti, s, time){
				if(!time)time = 1000;
				tipelem = elems[ti];
				//etip start!
				if(typeof(tipelem)=='object'){
					_etip(ti, s);
					return;
				}
				//etip end!
				if(ti!='')return;
				
				if(s==0){
					$("#doajax_div_loading").html(defaults.loading_text);
					return;
				}
				$("#doajax_div_loading").html(s);
				$("#doajax_div_loading").removeClass('doajax_loading').addClass('doajax_loading_ok');
				_status();
				window.setTimeout(function(){
					_status(0);
				}, time);
				//alert(funcs.etip);
			}
			//定义ETIP
			function _etip(ti, s){
				tipelem = elems[ti];
				tipelem.find("div[rel='etip']").html("<b>×</b>"+s);
				tipelem.find("div[rel='etip']").removeClass('doajax_etip').addClass('doajax_etip_ok');
				tipelem.find("div[rel='etip'] b").click(function(){
					//移除提示并清除timer
					$(this).parent("div[rel='etip']").remove();
					clearTimeout(timer[ti]);
					timer[ti] = null;
				});
				if(funcs.tiptime){						
					timer[ti] = window.setTimeout(function(){
						_estatus(ti, 1);
					}, funcs.tiptime);
					//alert(timer);
				}else{
					tipe = 0;
				}
			}
			
			//AJAX处理函数和显示状态
			function _go(s, data, type, funcs, ti){
				doane(event);
				if(funcs.tipelem){
					_estatus(ti);
				}else{
					_status();
				}
				
				XMLHttp[ti] = $.ajax({
					//async: false,
					type: type,
					url: s,
					cache: false,
					timeout: 10000,
					data: '',					
					beforeSend: function(){
						//before
					},
					success: function(msg){
						if(!funcs.custom){
							if(msg==defaults.flag_1){
								//.substr(0, 1)
								_atip(ti, '处理成功！');
								funcs.approve && funcs.approve.call(elem, msg);
							}else if(msg==defaults.flag_0){
								_atip(ti, '处理失败！');
								funcs.refuse && funcs.refuse.call(elem, msg);
							}else if(msg==''){
								_atip(ti, '未知信息！');
							}else{
								if(msg.length<100){
									_atip(ti, msg);
								}else{
									_atip(ti, '获取信息过长！');
								}
							}
						}else{
							funcs.tip && _atip(ti, funcs.tip);
							!funcs.tip && _atip(ti, '完成获取！');
							funcs.custom.call(elem, msg);							
						}
					},
					error: function(){
						if(XMLHttp[ti]){
							_atip(ti, '网络异常！');
						}
					},
					complete: function(){
						//_atip();
					}
				});
			}
			function doane(event) {
				e = event ? event : window.event;
				if($.browser.msie) {
					e.returnValue = false;
					e.cancelBubble = true;
				} else if(e) {
					e.stopPropagation();
					e.preventDefault();
				}
			}
		}
	});
})(jQuery);